package ai.loa.framework;

import java.util.Arrays;

public abstract class DefaultLOABoard extends AbstractLOABoard {

//	private int[][] board;
//
//	private int[][][][] destinations;
//
//	public DefaultLOABoard() {
//		board = new int[BOARD_SIZE][BOARD_SIZE];
//		destinations = new int[BOARD_SIZE][BOARD_SIZE][8][2];
//
//		for (int i = 0; i < board.length; i++) {
//			for (int j = 0; j < board.length; j++) {
//				if ((i == 0 && (j != 0 && j != 7))
//						|| (i == 7 && (j != 0 && j != 7))) {
//					board[i][j] = LOABoard.NERO;
//				} else if ((j == 0 && (i != 0 && i != 7))
//						|| (j == 7 && (i != 0 && i != 7))) {
//					board[i][j] = LOABoard.BIANCO;
//				} else {
//					board[i][j] = LOABoard.VUOTO;
//				}
//			}
//		}
//		for (int i = 0; i < board.length; i++) {
//			for (int j = 0; j < board.length; j++) {
//				contaPedineDirezione(j, i);
//			}
//		}
//		// String s = "";
//		// for (int i = 0; i < board.length; i++) {
//		// s += Arrays.toString(board[i]);
//		// s += "\n";
//		// }
//		// System.out.println(s);
//	}
//
//	public void contaPedineDirezione(int riga, int colonna) {
//		if (board[riga][colonna] == LOABoard.VUOTO) {
//			for (int i = 0; i < 8; i++) {
//				destinations[riga][colonna][i][0] = -1;
//				destinations[riga][colonna][i][1] = -1;
//			}
//		} else {
//			int pedRiga = 0, pedColonna = 0, pedDiagonale_1 = 0, pedDiagonale_2 = 0;
//
//			// Conta pedina sulla riga
//			for (int i = 0; i < board.length; i++) {
//				if (board[riga][i] != LOABoard.VUOTO) {
//					pedRiga++;
//				}
//			}
//
//			// Conta pedina sulla colonna
//			for (int j = 0; j < board.length; j++) {
//				if (board[j][colonna] != LOABoard.VUOTO) {
//					pedColonna++;
//				}
//			}
//
//			// Conta pedina sulla diagonale principale
//			switch (Math.abs(riga - colonna)) {
//			case 0:
//				for (int i = 0; i < board.length; i++) {
//					if (board[i][i] != LOABoard.VUOTO) {
//						pedDiagonale_1++;
//					}
//				}
//				break;
//			case 1:
//				if (riga - colonna < 0) {
//					for (int i = 0; i < board.length - 1; i++) {
//						if (board[i][i + 1] != LOABoard.VUOTO) {
//							pedDiagonale_1++;
//						}
//					}
//				} else {
//					for (int i = 0; i < board.length - 1; i++) {
//						if (board[i + 1][i] != LOABoard.VUOTO) {
//							pedDiagonale_1++;
//						}
//					}
//				}
//				break;
//			case 2:
//				if (riga - colonna < 0) {
//					for (int i = 0; i < board.length - 2; i++) {
//						if (board[i][i + 2] != LOABoard.VUOTO) {
//							pedDiagonale_1++;
//						}
//					}
//				} else {
//					for (int i = 0; i < board.length - 2; i++) {
//						if (board[i + 2][i] != LOABoard.VUOTO) {
//							pedDiagonale_1++;
//						}
//					}
//				}
//				break;
//			case 3:
//				if (riga - colonna < 0) {
//					for (int i = 0; i < board.length - 3; i++) {
//						if (board[i][i + 3] != LOABoard.VUOTO) {
//							pedDiagonale_1++;
//						}
//					}
//				} else {
//					for (int i = 0; i < board.length - 3; i++) {
//						if (board[i + 3][i] != LOABoard.VUOTO) {
//							pedDiagonale_1++;
//						}
//					}
//				}
//				break;
//			case 4:
//				if (riga - colonna < 0) {
//					for (int i = 0; i < board.length - 4; i++) {
//						if (board[i][i + 4] != LOABoard.VUOTO) {
//							pedDiagonale_1++;
//						}
//					}
//				} else {
//					for (int i = 0; i < board.length - 4; i++) {
//						if (board[i + 4][i] != LOABoard.VUOTO) {
//							pedDiagonale_1++;
//						}
//					}
//				}
//				break;
//			case 5:
//				if (riga - colonna < 0) {
//					for (int i = 0; i < board.length - 5; i++) {
//						if (board[i][i + 5] != LOABoard.VUOTO) {
//							pedDiagonale_1++;
//						}
//					}
//				} else {
//					for (int i = 0; i < board.length - 5; i++) {
//						if (board[i + 5][i] != LOABoard.VUOTO) {
//							pedDiagonale_1++;
//						}
//					}
//				}
//				break;
//			case 6:
//				if (riga - colonna < 0) {
//					for (int i = 0; i < board.length - 6; i++) {
//						if (board[i][i + 6] != LOABoard.VUOTO) {
//							pedDiagonale_1++;
//						}
//					}
//				} else {
//					for (int i = 0; i < board.length - 6; i++) {
//						if (board[i + 6][i] != LOABoard.VUOTO) {
//							pedDiagonale_1++;
//						}
//					}
//				}
//				break;
//			}
//			// Conta pedina sulla diagonale secondaria
//			switch (riga + colonna) {
//			case 7:
//				for (int i = 0; i < board.length; i++) {
//					if (board[i][7 - i] != LOABoard.VUOTO) {
//						pedDiagonale_2++;
//					}
//				}
//				break;
//			case 6:
//				for (int i = 0; i < board.length - 1; i++) {
//					if (board[i][6 - i] != LOABoard.VUOTO) {
//						pedDiagonale_2++;
//					}
//				}
//				break;
//			case 8:
//				for (int i = 0; i < board.length - 1; i++) {
//					if (board[i + 1][7 - i] != LOABoard.VUOTO) {
//						pedDiagonale_2++;
//					}
//				}
//				break;
//			case 5:
//				for (int i = 0; i < board.length - 2; i++) {
//					if (board[i][5 - i] != LOABoard.VUOTO) {
//						pedDiagonale_2++;
//					}
//				}
//				break;
//			case 9:
//				for (int i = 0; i < board.length - 2; i++) {
//					if (board[i + 2][7 - i] != LOABoard.VUOTO) {
//						pedDiagonale_2++;
//					}
//				}
//				break;
//			case 4:
//				for (int i = 0; i < board.length - 3; i++) {
//					if (board[i][4 - i] != LOABoard.VUOTO) {
//						pedDiagonale_2++;
//					}
//				}
//				break;
//			case 10:
//				for (int i = 0; i < board.length - 3; i++) {
//					if (board[i + 3][7 - i] != LOABoard.VUOTO) {
//						pedDiagonale_2++;
//					}
//				}
//				break;
//			case 3:
//				for (int i = 0; i < board.length - 4; i++) {
//					if (board[i][3 - i] != LOABoard.VUOTO) {
//						pedDiagonale_2++;
//					}
//				}
//				break;
//			case 11:
//				for (int i = 0; i < board.length - 4; i++) {
//					if (board[i + 4][7 - i] != LOABoard.VUOTO) {
//						pedDiagonale_2++;
//					}
//				}
//				break;
//			case 2:
//				for (int i = 0; i < board.length - 5; i++) {
//					if (board[i][2 - i] != LOABoard.VUOTO) {
//						pedDiagonale_2++;
//					}
//				}
//				break;
//			case 12:
//				for (int i = 0; i < board.length - 5; i++) {
//					if (board[i + 5][7 - i] != LOABoard.VUOTO) {
//						pedDiagonale_2++;
//					}
//				}
//				break;
//
//			case 1:
//				for (int i = 0; i < board.length - 6; i++) {
//					if (board[i][1 - i] != LOABoard.VUOTO) {
//						pedDiagonale_2++;
//					}
//				}
//				break;
//			case 13:
//				for (int i = 0; i < board.length - 6; i++) {
//					if (board[i + 6][7 - i] != LOABoard.VUOTO) {
//						pedDiagonale_2++;
//					}
//				}
//				break;
//			}
//
//			// Popoliamo l'array di coppie
//
//			if (riga - pedColonna >= 0
//					&& board[riga - pedColonna][colonna] != board[riga][colonna]
//					&& freeDirection(riga, colonna, 0, pedColonna)) {
//				destinations[riga][colonna][0][0] = riga - pedColonna;
//				destinations[riga][colonna][0][1] = colonna;
//			} else {
//				destinations[riga][colonna][0][0] = -1;
//				destinations[riga][colonna][0][1] = -1;
//			}
//
//			// Direzione 1 (Nord-Est)
//			if (riga - pedDiagonale_2 >= 0
//					&& colonna + pedDiagonale_2 <= 7
//					&& board[riga - pedDiagonale_2][colonna + pedDiagonale_2] != board[riga][colonna]
//					&& freeDirection(riga, colonna, 1, pedDiagonale_2)) {
//				destinations[riga][colonna][1][0] = riga - pedDiagonale_2;
//				destinations[riga][colonna][1][1] = colonna + pedDiagonale_2;
//			} else {
//				destinations[riga][colonna][1][0] = -1;
//				destinations[riga][colonna][1][1] = -1;
//			}
//
//			// Direzione 2 (Est)
//			if (colonna + pedRiga <= 7
//					&& board[riga][colonna + pedRiga] != board[riga][colonna]
//					&& freeDirection(riga, colonna, 2, pedRiga)) {
//				destinations[riga][colonna][2][0] = riga;
//				destinations[riga][colonna][2][1] = colonna + pedRiga;
//			} else {
//				destinations[riga][colonna][2][0] = -1;
//				destinations[riga][colonna][2][1] = -1;
//			}
//
//			// Direzione 3 (Sud-Est)
//			if (riga + pedDiagonale_1 <= 7
//					&& colonna + pedDiagonale_1 <= 7
//					&& board[riga + pedDiagonale_1][colonna + pedDiagonale_1] != board[riga][colonna]
//					&& freeDirection(riga, colonna, 3, pedDiagonale_1)) {
//				destinations[riga][colonna][3][0] = riga + pedDiagonale_1;
//				destinations[riga][colonna][3][1] = colonna + pedDiagonale_1;
//			} else {
//				destinations[riga][colonna][3][0] = -1;
//				destinations[riga][colonna][3][1] = -1;
//			}
//
//			// Direzione 4 (Sud)
//			if (riga + pedColonna <= 7
//					&& board[riga + pedColonna][colonna] != board[riga][colonna]
//					&& freeDirection(riga, colonna, 4, pedColonna)) {
//				destinations[riga][colonna][4][0] = riga + pedColonna;
//				destinations[riga][colonna][4][1] = colonna;
//			} else {
//				destinations[riga][colonna][4][0] = -1;
//				destinations[riga][colonna][4][1] = -1;
//			}
//
//			// Direzione 5 (Sud-Ovest)
//			if (colonna - pedDiagonale_2 >= 0
//					&& riga + pedDiagonale_2 <= 7
//					&& board[riga + pedDiagonale_2][colonna - pedDiagonale_2] != board[riga][colonna]
//					&& freeDirection(riga, colonna, 5, pedDiagonale_2)) {
//				destinations[riga][colonna][5][0] = riga + pedDiagonale_2;
//				destinations[riga][colonna][5][1] = colonna - pedDiagonale_2;
//			} else {
//				destinations[riga][colonna][5][0] = -1;
//				destinations[riga][colonna][5][1] = -1;
//			}
//
//			// Direzione 6 (Ovest)
//			if (colonna - pedRiga >= 0
//					&& board[riga][colonna - pedRiga] != board[riga][colonna]
//					&& freeDirection(riga, colonna, 6, pedRiga)) {
//				destinations[riga][colonna][6][0] = riga;
//				destinations[riga][colonna][6][1] = colonna - pedRiga;
//			} else {
//				destinations[riga][colonna][6][0] = -1;
//				destinations[riga][colonna][6][1] = -1;
//			}
//
//			// Direzione 7 (Nord-Ovest)
//			if (riga - pedDiagonale_1 >= 0
//					&& colonna - pedDiagonale_1 >= 0
//					&& board[riga - pedDiagonale_1][colonna - pedDiagonale_1] != board[riga][colonna]
//					&& freeDirection(riga, colonna, 7, pedDiagonale_1)) {
//				destinations[riga][colonna][7][0] = riga - pedDiagonale_1;
//				destinations[riga][colonna][7][1] = colonna - pedDiagonale_1;
//			} else {
//				destinations[riga][colonna][7][0] = -1;
//				destinations[riga][colonna][7][1] = -1;
//			}
//
//			// for (int k = 0; k < 8; k++) {
//			// String s = "RIGA " + riga + " COLONNA " + colonna + " "
//			// + " posizioni raggiungibili " + "direzione " + k
//			// + Arrays.toString(destinations[riga][colonna][k]);
//			// System.out.println(s);
//			// }
//		}
//
//	}
//
//	private boolean freeDirection(int rigaPartenza, int colonnaPartenza,
//			int direzione, int pos) {
//
//		switch (direzione) {
//		case 0:// NORD
//			for (int i = 1; i < pos; i++) {
//				if (rigaPartenza - i < 0
//						|| ((board[rigaPartenza][colonnaPartenza] + 1) % 2) == board[rigaPartenza
//								- i][colonnaPartenza]) {
//					return false;
//				}
//			}
//			break;
//		case 1:// NORD-EST
//			for (int i = 1; i < pos; i++) {
//				if (rigaPartenza - i < 0
//						|| colonnaPartenza + i > 7
//						|| ((board[rigaPartenza][colonnaPartenza] + 1) % 2) == board[rigaPartenza
//								- i][colonnaPartenza + i]) {
//					return false;
//				}
//			}
//			break;
//		case 2:// EST
//			for (int i = 1; i < pos; i++) {
//				if (((board[rigaPartenza][colonnaPartenza] + 1) % 2) == board[rigaPartenza][colonnaPartenza
//						+ i]) {
//					return false;
//				}
//			}
//			break;
//		case 3:// SUD-EST
//			for (int i = 1; i < pos; i++) {
//				if (((board[rigaPartenza][colonnaPartenza] + 1) % 2) == board[rigaPartenza
//						+ i][colonnaPartenza + i]) {
//					return false;
//				}
//			}
//			break;
//		case 4:// SUD
//			for (int i = 1; i < pos; i++) {
//				if (((board[rigaPartenza][colonnaPartenza] + 1) % 2) == board[rigaPartenza
//						+ i][colonnaPartenza]) {
//					return false;
//				}
//			}
//			break;
//		case 5:// SUD-OVEST
//			for (int i = 1; i < pos; i++) {
//				if (((board[rigaPartenza][colonnaPartenza] + 1) % 2) == board[rigaPartenza
//						+ i][colonnaPartenza - i]) {
//					return false;
//				}
//			}
//			break;
//		case 6:// OVEST
//			for (int i = 1; i < pos; i++) {
//				if (((board[rigaPartenza][colonnaPartenza] + 1) % 2) == board[rigaPartenza][colonnaPartenza
//						- i]) {
//					return false;
//				}
//			}
//			break;
//		case 7:// NORD-OVEST
//			for (int i = 1; i < pos; i++) {
//				if (((board[rigaPartenza][colonnaPartenza] + 1) % 2) == board[rigaPartenza
//						- i][colonnaPartenza - i]) {
//					return false;
//				}
//			}
//			break;
//		}
//		return true;
//	}
//
//	@Override
//	public int[][] getDestinations(int i, int j) {
//		return destinations[i][j];
//	}
//
//	@Override
//	public int getPiece(int i, int j) {
//		return board[i][j];
//	}
//
//	@Override
//	public void setPiece(int i, int j, int player) {
//		if (player == PLAYER_1) {
//			board[i][j] = BIANCO;
//		} else if (player == PLAYER_2) {
//			board[i][j] = NERO;
//		} else {
//			board[i][j] = VUOTO;
//		}
//		notifyListeners(new LOAEvent(i, j));
//	}
//
//	@Override
//	public String toString() {
//		String s = "";
//		for (int i = 0; i < board.length; i++) {
//			s += Arrays.toString(board[i]);
//			s=s.replaceAll("-1", "W");
//			s += "\n";
//		}
//		return s;
//	}
//
//	@Override
//	public void updateDirezioneCasella(int riga, int colonna) {
//		contaPedineDirezione(riga, colonna);
//
//		// aggiorniamo tutta la riga
//		for (int i = 0; i < board.length; i++) {
//			if (board[riga][i] != VUOTO && i != colonna) {
//				contaPedineDirezione(riga, i);
//			}
//		}
//
//		// aggiorniamo tutta la colonna
//		for (int i = 0; i < board.length; i++) {
//			if (board[i][colonna] != VUOTO && i != riga) {
//				contaPedineDirezione(i, colonna);
//			}
//		}
//
//		// aggiorniamo tutta la diagonale principale
//		switch (Math.abs(riga - colonna)) {
//		case 0:
//			for (int i = 0; i < board.length; i++) {
//				if (i != riga && i != colonna && board[i][i] != LOABoard.VUOTO) {
//					contaPedineDirezione(i, i);
//				}
//			}
//			break;
//		case 1:
//			if (riga - colonna < 0) {
//				for (int i = 0; i < board.length - 1; i++) {
//					if (i != riga && i + 1 != colonna
//							&& board[i][i + 1] != LOABoard.VUOTO) {
//						contaPedineDirezione(i, i + 1);
//					}
//				}
//			} else {
//				for (int i = 0; i < board.length - 1; i++) {
//					if (i + 1 != riga && i != colonna
//							&& board[i + 1][i] != LOABoard.VUOTO) {
//						contaPedineDirezione(i + 1, i);
//					}
//				}
//			}
//			break;
//		case 2:
//			if (riga - colonna < 0) {
//				for (int i = 0; i < board.length - 2; i++) {
//					if (i != riga && i + 2 != colonna
//							&& board[i][i + 2] != LOABoard.VUOTO) {
//						contaPedineDirezione(i, i + 2);
//					}
//				}
//			} else {
//				for (int i = 0; i < board.length - 2; i++) {
//					if (i + 2 != riga && i != colonna
//							&& board[i + 2][i] != LOABoard.VUOTO) {
//						contaPedineDirezione(i + 2, i);
//					}
//				}
//			}
//			break;
//		case 3:
//			if (riga - colonna < 0) {
//				for (int i = 0; i < board.length - 3; i++) {
//					if (i != riga && i + 3 != colonna
//							&& board[i][i + 3] != LOABoard.VUOTO) {
//						contaPedineDirezione(i, i + 3);
//					}
//				}
//			} else {
//				for (int i = 0; i < board.length - 3; i++) {
//					if (i + 3 != riga && i != colonna
//							&& board[i + 3][i] != LOABoard.VUOTO) {
//						contaPedineDirezione(i + 3, i);
//					}
//				}
//			}
//			break;
//		case 4:
//			if (riga - colonna < 0) {
//				for (int i = 0; i < board.length - 4; i++) {
//					if (i != riga && i + 4 != colonna
//							&& board[i][i + 4] != LOABoard.VUOTO) {
//						contaPedineDirezione(i, i + 4);
//					}
//				}
//			} else {
//				for (int i = 0; i < board.length - 4; i++) {
//					if (i + 4 != riga && i != colonna
//							&& board[i + 4][i] != LOABoard.VUOTO) {
//						contaPedineDirezione(i + 4, i);
//					}
//				}
//			}
//			break;
//		case 5:
//			if (riga - colonna < 0) {
//				for (int i = 0; i < board.length - 5; i++) {
//					if (i != riga && i + 5 != colonna
//							&& board[i][i + 5] != LOABoard.VUOTO) {
//						contaPedineDirezione(i, i + 5);
//					}
//				}
//			} else {
//				for (int i = 0; i < board.length - 5; i++) {
//					if (i + 5 != riga && i != colonna
//							&& board[i + 5][i] != LOABoard.VUOTO) {
//						contaPedineDirezione(i + 5, i);
//					}
//				}
//			}
//			break;
//		case 6:
//			if (riga - colonna < 0) {
//				for (int i = 0; i < board.length - 6; i++) {
//					if (i != riga && i + 6 != colonna
//							&& board[i][i + 6] != LOABoard.VUOTO) {
//						contaPedineDirezione(i, i + 6);
//					}
//				}
//			} else {
//				for (int i = 0; i < board.length - 6; i++) {
//					if (i + 6 != riga && i != colonna
//							&& board[i + 6][i] != LOABoard.VUOTO) {
//						contaPedineDirezione(i + 6, i);
//					}
//				}
//			}
//			break;
//		}
//
//		// aggiorniamo tutta la diagonale secondaria
//		switch (riga + colonna) {
//		case 7:
//			for (int i = 0; i < board.length; i++) {
//				if (i != riga && 7 - i != colonna
//						&& board[i][7 - i] != LOABoard.VUOTO) {
//					contaPedineDirezione(i, 7 - i);
//				}
//			}
//			break;
//		case 6:
//			for (int i = 0; i < board.length - 1; i++) {
//				if (i != riga && 6 - i != colonna
//						&& board[i][6 - i] != LOABoard.VUOTO) {
//					contaPedineDirezione(i, 6 - i);
//				}
//			}
//			break;
//		case 8:
//			for (int i = 0; i < board.length - 1; i++) {
//				if (i + 1 != riga && 7 - i != colonna
//						&& board[i + 1][7 - i] != LOABoard.VUOTO) {
//					contaPedineDirezione(i + 1, 7 - i);
//				}
//			}
//			break;
//		case 5:
//			for (int i = 0; i < board.length - 2; i++) {
//				if (i != riga && 5 - i != colonna
//						&& board[i][5 - i] != LOABoard.VUOTO) {
//					contaPedineDirezione(i, 5 - i);
//				}
//			}
//			break;
//		case 9:
//			for (int i = 0; i < board.length - 2; i++) {
//				if (i + 2 != riga && 7 - i != colonna
//						&& board[i + 2][7 - i] != LOABoard.VUOTO) {
//					contaPedineDirezione(i + 2, 7 - i);
//				}
//			}
//			break;
//		case 4:
//			for (int i = 0; i < board.length - 3; i++) {
//				if (i != riga && 4 - i != colonna
//						&& board[i][4 - i] != LOABoard.VUOTO) {
//					contaPedineDirezione(i, 4 - i);
//				}
//			}
//			break;
//		case 10:
//			for (int i = 0; i < board.length - 3; i++) {
//				if (i + 3 != riga && 7 - i != colonna
//						&& board[i + 3][7 - i] != LOABoard.VUOTO) {
//					contaPedineDirezione(i + 3, 7 - i);
//				}
//			}
//			break;
//		case 3:
//			for (int i = 0; i < board.length - 4; i++) {
//				if (i != riga && 3 - i != colonna
//						&& board[i][3 - i] != LOABoard.VUOTO) {
//					contaPedineDirezione(i, 3 - i);
//				}
//			}
//			break;
//		case 11:
//			for (int i = 0; i < board.length - 4; i++) {
//				if (i + 4 != riga && 7 - i != colonna
//						&& board[i + 4][7 - i] != LOABoard.VUOTO) {
//					contaPedineDirezione(i + 4, 7 - i);
//				}
//			}
//			break;
//		case 2:
//			for (int i = 0; i < board.length - 5; i++) {
//				if (i != riga && 2 - i != colonna
//						&& board[i][2 - i] != LOABoard.VUOTO) {
//					contaPedineDirezione(i, 2 - i);
//				}
//			}
//			break;
//		case 12:
//			for (int i = 0; i < board.length - 5; i++) {
//				if (i + 5 != riga && 7 - i != colonna
//						&& board[i + 5][7 - i] != LOABoard.VUOTO) {
//					contaPedineDirezione(i + 5, 7 - i);
//				}
//			}
//			break;
//
//		case 1:
//			for (int i = 0; i < board.length - 6; i++) {
//				if (i != riga && 1 - i != colonna
//						&& board[i][1 - i] != LOABoard.VUOTO) {
//					contaPedineDirezione(i, 1 - i);
//				}
//			}
//			break;
//		case 13:
//			for (int i = 0; i < board.length - 6; i++) {
//				if (i + 6 != riga && 7 - i != colonna
//						&& board[i + 6][7 - i] != LOABoard.VUOTO) {
//					contaPedineDirezione(i + 6, 7 - i);
//				}
//			}
//			break;
//		}
//	}
}
